package br.com.condominio.view.beans;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import br.com.condominio.controller.ResidenciaController;
import br.com.condominio.controller.VisitaController;
import br.com.condominio.controller.VisitanteController;
import br.com.condominio.view.vo.EnumStatusVisita;
import br.com.condominio.view.vo.ResidenciaVO;
import br.com.condominio.view.vo.VisitaVO;
import br.com.condominio.view.vo.VisitanteVO;

/**
 * @author marco.freitas
 * 
 */
@ManagedBean(name = "visitaMBean")
@SessionScoped
public class VisitaMBean extends SessionMBean {

	// Controller para acesso ao DAO
	private final VisitaController controller;

	private VisitaVO visitaVO = new VisitaVO();
	private DataModel<VisitaVO> listagemVisitas;

	private int visitanteSelected;
	private int residenciaSelected;
	private int totalVisitas = 0;

	public VisitaMBean() throws ClassNotFoundException, SQLException {
		controller = new VisitaController();
		visitaVO = new VisitaVO();
	}

	public VisitaVO getVisitaVO() {
		return visitaVO;
	}

	public void setVisitaVO(VisitaVO visitaVO) {
		this.visitaVO = visitaVO;
	}

	/**
	 * Salva uma vista no sistema.
	 * 
	 * @return String com pagina de retorno.
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public String salvar() throws SQLException, ClassNotFoundException {
		String retorno = "../erro";

		try {
			visitaVO.setCodResidencia(residenciaSelected);
			visitaVO.setCodVisitante(visitanteSelected);

			if (visitaVO.getCodVisita() == 0) {
				// Status Visita: 0-Aguardando 1-Confirmada 2-Cancelada
				visitaVO.setStatusVisita(0);
				if (controller.criar(visitaVO)) {
					retorno = "listagem_visitas";
				}
			} else {
				if (controller.atualizar(visitaVO)) {
					retorno = "listagem_visitas";
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return retorno;
	}

	public DataModel<VisitaVO> getListagemVisitas() throws SQLException,
			ClassNotFoundException {
		List<VisitaVO> lista = controller.getAllVisitas();
		this.totalVisitas = lista.size();
		listagemVisitas = new ListDataModel<VisitaVO>(lista);
		return listagemVisitas;
	}

	public void setListagemVisitas(DataModel<VisitaVO> listagemVisitas) {
		this.listagemVisitas = listagemVisitas;
	}

	public String excluir() throws SQLException, ClassNotFoundException {
		String retorno = "erro";

		if (controller.excluir(visitaVO)) {
			retorno = "listagem_visitas";
		}
		return retorno;
	}

	public String confirmarVisita() {
		String retorno = "erro";

		try {
			// Status Visita: 0-Aguardando 1-Confirmada 2-Cancelada
			visitaVO.setStatusVisita(1);
			if (controller.confirmaCancelaVisita(visitaVO)) {
				retorno = "listagem_visitas";
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retorno;
	}

	public void insert() {
		visitaVO = new VisitaVO();
	}

	public void selecionar() {
		visitaVO = listagemVisitas.getRowData();
	}

	public void alterar() {
		visitaVO = listagemVisitas.getRowData();
		residenciaSelected = visitaVO.getCodResidencia();
		visitanteSelected = visitaVO.getCodVisitante();
	}

	// TODO: Fazer o vinculo com residencia...
	public int getResidenciaSelected() {
		return residenciaSelected;
	}

	// TODO: Fazer o vinculo com residencia...
	public void setResidenciaSelected(int residenciaSelected) {
		this.residenciaSelected = residenciaSelected;
	}

	// TODO: Fazer o vinculo com residencia...
	public Collection<SelectItem> getListaResidencias() throws SQLException,
			ClassNotFoundException {
		Collection<SelectItem> lista = new ArrayList<SelectItem>();
		List<ResidenciaVO> listaResidencias = new ResidenciaController()
				.getAllResidencias();
		for (int i = 0; i < listaResidencias.size(); i++) {
			lista.add(new SelectItem(
					listaResidencias.get(i).getCodResidencia(),
					listaResidencias.get(i).getDescricao()));
		}
		return lista;
	}

	public Collection<SelectItem> getListaVisitantes() throws SQLException,
			ClassNotFoundException {
		Collection<SelectItem> lista = new ArrayList<SelectItem>();
		List<VisitanteVO> listaVisitantes = new VisitanteController()
				.getAllVisitantes();
		for (int i = 0; i < listaVisitantes.size(); i++) {
			lista.add(new SelectItem(listaVisitantes.get(i).getCodVisitante(),
					listaVisitantes.get(i).getNome()));
		}
		return lista;
	}

	public int getVisitanteSelected() {
		return visitanteSelected;
	}

	public void setVisitanteSelected(int visitanteSelected) {
		this.visitanteSelected = visitanteSelected;
	}

	public String traduzirStatusVisita(final int codHistorico) {
		return EnumStatusVisita.getFromCode(codHistorico).getLabel();
	}

	public int getTotalVisitas() {
		return totalVisitas;
	}

	public void setTotalVisitas(int totalVisitas) {
		this.totalVisitas = totalVisitas;
	}
}
